#include <iostream>

//浅拷贝：类中有指针成员变量：拷贝时只是进行指针拷贝，导致两个指针指向同一块内存，发生两次释放
//浅拷贝中的指针拷贝看做是地址拷贝，不是内存拷贝；
//深拷贝：不是地址拷贝，是内存拷贝
class Test
{
public:
    Test()
    {
        std::cout << "构造函数！\n";
        a = new int;
    }

    Test(const Test& t)
    {
        std::cout<<"深拷贝构造函数！\n";
        // a = t.a;  // 地址拷贝 （不能这样写）
        a = new int(*t.a); //申请一个空间，把t.a空间中的值给拷贝过去
    }

    void operator = (const Test& t)
    {
        delete a;     //  先把原来的放掉，否则会有内存泄露
        std::cout<<"赋值运算符重载深拷贝！\n";
        a = new int(*t.a);
    }
    ~Test()
    {
        std::cout << "析构函数！\n";
        delete a;
    }
private:
    int *a;
};

int main()
{
    Test t;
    // Test t2 = t;   // 调拷贝构造函数
    Test t2;
    t2 = t; //调赋值运算符重载
    return 0;
}
